import * as Cesium from 'cesium';

class WallGradientMaterialProperty {
  constructor(color) {
    this._definitionChanged = new Cesium.Event();
    this._color = undefined;
    this._colorSubscription = undefined;

    this.color = color;
  }
  get isConstant() {
    return false;
  }
  get definitionChanged() {
    return this._definitionChanged;
  }
  getType() {
    return 'wallGradient';
  }
  getValue(time, result) {
    if (!Cesium.defined(result)) {
      result = {};
    }
    result.color = Cesium.Property.getValueOrClonedDefault(
      this._color,
      time,
      Cesium.Color.WHITE,
      result.color
    );
    return result;
  }
  equals(other) {
    return (
      this === other || //
      (other instanceof WallGradientMaterialProperty && //
        Cesium.Property.equals(this._color, other._color))
    );
  }
}


// 将普通的属性包装为property
Object.defineProperties(WallGradientMaterialProperty.prototype, {
  color: Cesium.createPropertyDescriptor("color")
});


/**
 * 将材质添加到材质引擎中
 * @type {string}
 * @readonly
 */
Cesium.Material.WallGradientMaterialProperty = "wallGradient";
Cesium.Material._materialCache.addMaterial(Cesium.Material.WallGradientMaterialProperty, {
  fabric: {
    type: Cesium.Material.WallGradientMaterialProperty,
    uniforms: {
      color: Cesium.Color.ORANGE,
      wallTexture: new URL('/src/assets/wallgradients.png', import.meta.url).href
    },
    source:/*glsl*/`
        // 在自定义材质里面，需要自己吧uniform写好
        uniform vec4 color;
        uniform sampler2D wallTexture;
        // 这个主函数是有返回值的
        czm_material czm_getMaterial(czm_materialInput materialInput){
            // 起手式：一开始就要调用czm_getDefaultMaterial内置函数得到一个material变量
            // 这个material变量里面就是最终要返回的材质属性
            // diffuse,alpha,emssion,specular....
            // materialInput是函数的入参，也是cesium送给我们的，里面包含了材质的基本属性包括uv坐标
            czm_material material=czm_getDefaultMaterial(materialInput);
            vec2 uv=materialInput.st;
            vec4 col=texture2D(wallTexture,uv);
            float iTime=czm_frameNumber/0.05; // 控制动画速度
            iTime=sin(iTime); // 取小数部分
            material.diffuse=color.rgb;// 颜色
            material.alpha=col.a*clamp(iTime,0.8,1.0);// 透明度
            return material;
        } 
     `
  },
  translucent: function (material) {
    return true
  },
});

export default WallGradientMaterialProperty;
